package com.xuecheng.publish.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xuecheng.api.content.model.dto.TeachplanDTO;
import com.xuecheng.common.enums.content.CourseModeEnum;
import com.xuecheng.common.util.JsonUtil;
import com.xuecheng.publish.common.constant.CoursePubTemplateKey;
import com.xuecheng.publish.entity.CourseMarket;
import com.xuecheng.publish.entity.CoursePub;
import com.xuecheng.publish.entity.CoursePubMsg;
import com.xuecheng.publish.mapper.CoursePubMapper;
import com.xuecheng.publish.service.CoursePubService;
import freemarker.template.Configuration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 课程发布 服务实现类
 * </p>
 *
 * @author itcast
 */
@Slf4j
@Service
public class CoursePubServiceImpl extends ServiceImpl<CoursePubMapper, CoursePub> implements CoursePubService {


    @Autowired
    private Configuration configuration;

    /*

    #生成静态化页面发布位置
    course.publish.position = pages/
    #七牛云的存储消息
    file.qiniu.accessKey = pFcOu02W6CdSqjY6qmRH1jz--pwfQEVyuM4RkBGC
    file.qiniu.secretKey = z4CqmQb9LYD3AiuViX3ADk3r3-iOAm9yQePGP6Hh
    file.qiniu.bucket = xc134-staitc-pages
        * */

    @Value("${file.qiniu.accessKey}")
    private String accessKey;

    @Value("${file.qiniu.secretKey}")
    private String secretKey;

    @Value("${file.qiniu.bucket}")
    private String bucket;

    @Value("${course.publish.position}")
    private String position;


    /*
    * 业务分析：
    *   1.判断消息的幂等性
    *       PS：在MQ的消费方如果有消息重试，必须要考虑消息的幂等性
    *       使用CoursePub 的 isPub来标识消息的幂等性
    *           0:已经发布页面
    *           1:没有发布页面
    *   2.生成课程页面
    *       数据模型：coursePubId
    *       页面模板：Configuration
    *   3.将生成后的页面信息上传到cdn服务上
    *
    *   4.修改课程发布的幂等值：isPub=0
    * */
    @Transactional
    public void publishPage(CoursePubMsg coursePubMsg) {
        // 测试消息重试
        // int i = 1 / 0;

        //1.判断消息的幂等性
        //     PS：在MQ的消费方如果有消息重试，必须要考虑消息的幂等性
        //     使用CoursePub 的 isPub来标识消息的幂等性
        //         0:已经发布页面
        //         1:没有发布页面
        // 如果课程页面已经发布，记录消息，但不要抛出异常，抛出异常后，spring-retry会进行重试

        // 2.生成课程页面(模板+数据=html)
        //     数据模型：coursePubId  generateDataMap
        //     页面模板：Configuration

        // 3.修改课程发布的幂等值：isPub=0

        // 4.将生成后的页面信息上传到七牛云cdn服务上
        /*
        * htmlKey:文件标识
        *       要体现出上传的文件目录
        *       文件名称的唯一
        *       和coursePub数据能够对应上
        *      形式：pages/coursePubId.html
        * */

    }


    /**
     * 页面静态化需要的数据
     * @param coursePub
     * @return Map<String, Object>
     */
    private Map<String, Object> generateDataMap(CoursePub coursePub) {

        // 1.构建数据模型对象
        HashMap<String, Object> dataMap = new HashMap<>();

        // 2.构建coursePub
        dataMap.put(CoursePubTemplateKey.COURSEPUB, coursePub);

        // 3.构建courseMarket
        String marketJsonString = coursePub.getMarket();
        CourseMarket courseMarket = JsonUtil.jsonToObject(marketJsonString, CourseMarket.class);

        dataMap.put(CoursePubTemplateKey.COURSEMARKET,courseMarket );

        // 4.构建课程计划
        String teachplanJsonString = coursePub.getTeachplan();
        TeachplanDTO teachplanDTO = JsonUtil.jsonToObject(teachplanJsonString, TeachplanDTO.class);
        dataMap.put(CoursePubTemplateKey.TEACHPLANNODE,teachplanDTO );

        // 5.构建课程模式
        CourseModeEnum[] values = CourseModeEnum.values();
        dataMap.put(CoursePubTemplateKey.COURSETEACHMODEENUMS,values );

        return dataMap;
    }
}
